package cn.ahaiahaixx.dp.singleton;

/**
 * 懒汉式单列，只有调用获取实例的时候才会创建
 * 
 * @author Aiden Pearce
 *
 */
public class ThreadSafeSingleton {
  /**
   * 第一步声明线程保护的实例变量
   */
  private static volatile ThreadSafeSingleton singleton;

  /**
   * 第二步私有化构造
   */
  private ThreadSafeSingleton() {

  }

  /**
   * 第三步，带判断的创建对象实例
   */
  public static ThreadSafeSingleton getInstance() {
    // 只有对象为Null才会启动创建过程
    if (singleton == null) {
      // 为了确保线程安全必须锁定每次只能有一个线程进入下面的方法
      // synchronized关键字是确保括号中的对象，一次只能有一个线程访问
      // 由于静态只能通过类访问，所以只需要锁定类就可以了
      synchronized (ThreadSafeSingleton.class) {
        if (singleton == null) {
          singleton = new ThreadSafeSingleton();
          return singleton;
        }
      }
    }
    // 如果已经存在实例，就直接返回
    return singleton;
  }
}
